#include <iostream>
//link：https://www.lanqiao.cn/problems/110/learning/
using namespace std;

//合并(ii合并到j的集合中：把i的根节点root[find(i)]指向（=）集合的根部find(j]) 】
//查询   查看a,b是否在同一个集合中:find(a)==find(b)  递归查询（如果不是根，那就查父节点的根，结果修正父节点，包括自己的根为根节点）
const int maxn = 1e6;
int father[maxn+1]; //一共mm*n个植物要划分到集合中去， 我们要为这m*n个植物分配root
int find(int x){
  //找元素x的根节点:父结点是自己
  if (x==father[x]) return x;
  else return father[x] = find(father[x]);//不是，那就记忆化搜索，把沿途所有的结点都直接和最后的根节点相连（缩小搜索链的长度）
}
int m,n,N;
int main()
{
  // 请在此输入您的代码
  cin>>m>>n;
  N = m*n;//平铺数组
  //所有结点初始化为根节点!!!!很重要（因为单独一个就是一个分量）
  for(int i=1;i<=N;i++)
    father[i] = i;
  int k;cin>>k;
  while(k--){
    int a,b;
    cin>>a>>b;//a和b合并在一个连通分量里
    if (find(a)!=find(b)){ //如果不是一个集合里的
     father[find(b)] =  find(a);//b并入a:b的根节点的父节点设为 a的根节点
    }
  }
 //数分量的个数  = 数根节点的个数
  int sum = 0;
  for(int i=0;i<N;i++){
    if (i==father[i]){
     sum++;//是根
    }
  }
  cout<<sum;



  return 0;
}
